package com.huhu.sys.redis.aop;

/**
 * Created by Tremain on 2017/1/21.
 */
//@Aspect
//@Component
public class RedisCacheableAspect {

//    @Autowired
//    private RedisUtil redisUtil;
//
//    @Around("@annotation(cache)")
//    public Object cached(final ProceedingJoinPoint pjp, RedisCacheable cache) throws Throwable {
//
//        System.out.println("-----------------------------------");
//
//        String key = getCacheKey(pjp, cache);
//        String signature = pjp.getSignature().toLongString();
//        String returnType = signature.split(" ")[1];
//        Object value = redisUtil.get(key,Class.forName(returnType));    //从缓存获取数据
//        if(value != null) {
//            return value;
//        }
//        value = pjp.proceed();      //跳过缓存,到后端查询数据
//
//        if(value == null)
//            return value;
//
//        if(cache.expire()<=0) {      //如果没有设置过期时间,则无限期缓存
//            redisUtil.set(key, value);
//        } else {                    //否则设置缓存时间
//            redisUtil.set(key, value, cache.expire());
//        }
//        return value;
//    }
//
//    /**
//     * 获取缓存的key值
//     * @param pjp
//     * @param cache
//     * @return
//     */
//    private String getCacheKey(ProceedingJoinPoint pjp,RedisCacheable cache) {
//
//        StringBuilder buf=new StringBuilder();
//        buf.append(pjp.getSignature().getDeclaringTypeName()).append(".").append(pjp.getSignature().getName());
//        String keyStr = cache.key();
//        if(!(cache.keyMode()==KeyMode.BEAN)){
//            if(keyStr.length()>0) {
//                buf.append(".").append(keyStr);
//            }
//
//        }
//
//        Object[] args=pjp.getArgs();
//        if(cache.keyMode()==KeyMode.DEFAULT) {
//            Annotation[][] pas=((MethodSignature)pjp.getSignature()).getMethod().getParameterAnnotations();
//            for(int i=0;i<pas.length;i++) {
//                for(Annotation an:pas[i]) {
//                    if(an instanceof RedisCacheKey) {
//                        buf.append(".").append(args[i].toString());
//                        break;
//                    }
//                }
//            }
//        } else if(cache.keyMode()==KeyMode.BASIC) {
//            for(Object arg:args) {
//                if(arg instanceof String) {
//                    buf.append(".").append(arg);
//                } else if(arg instanceof Integer || arg instanceof Long || arg instanceof Short) {
//                    buf.append(".").append(arg.toString());
//                } else if(arg instanceof Boolean) {
//                    buf.append(".").append(arg.toString());
//                }
//            }
//        } else if(cache.keyMode()==KeyMode.ALL) {
//            for(Object arg:args) {
//                buf.append(".").append(arg.toString());
//            }
//        } else if(cache.keyMode()==KeyMode.BEAN) {
//            if(keyStr.length()>0) {
//                Object target = args[0];
//                Field field = ReflectionUtils.findField(target.getClass(), keyStr);
//                ReflectionUtils.makeAccessible(field);
//                Object value = ReflectionUtils.getField(field, target);
//                buf.append("#").append(value);
//            }
//        } else if(cache.keyMode()==KeyMode.MAP) {
//            if(keyStr.length()>0) {
//                Map target = (Map)args[0];
//                buf.append("#").append(target.get(keyStr));
//            }
//        }
//
//        return buf.toString();
//    }




}
